package wyszukiwanieLukow;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;

import typydanych.Obrazek;


public class WykrywanieLinii {
	
	//private Obrazek kopiaObrazka;													//DEBUG
	//private List<Point> kopiaPunktowLinii;										//DEBUG
	
	public List<Point> zbierzPunktyNalezaceDoCzesciLuku(Obrazek obrazek, int prog, int lewaGranica, int prawaGranica,int gornaGranica, int dolnaGranica){

		//DEBUG
		//		kopiaObrazka = new Obrazek();
//		for (int x = 0; x < obrazek.ROZMIAR; x++) {
//			for (int y = 0; y < obrazek.ROZMIAR; y++) {
//				kopiaObrazka.set(x, y, obrazek.get(x, y));
//			}
//		}
		
		List<Point> punktyNalezaceDoLinii = new ArrayList<Point>();
		//kopiaPunktowLinii = punktyNalezaceDoLinii;								//DEBUG
		List<Integer> wspolrzedneGrubosciLinii= new ArrayList<Integer>();
		boolean ciaglosc = false;
		for (int x = lewaGranica; x < prawaGranica; x++) {
			for (int y = gornaGranica; y <= dolnaGranica; y++) {
				if(obrazek.get(x, y) > 0 + prog){
					wspolrzedneGrubosciLinii.add(y);
				}
			}
			if(wspolrzedneGrubosciLinii.size() > 0){
				if(ciaglosc == false && punktyNalezaceDoLinii.size() > 0){
					return null;	//jesli wystepuje nieciaglosc w punktach
				}
				punktyNalezaceDoLinii.add(new Point(x,podajSredniaWartoscWspolrzednejY(wspolrzedneGrubosciLinii)));
				
				wspolrzedneGrubosciLinii.clear();
				ciaglosc = true;
			}else {
				ciaglosc = false;
			}
		}
		if(punktyNalezaceDoLinii.size() == 0)
			return null;	//jesli nie znaleziono zadnych punktow w obszarze
		
		//narysujLinie();															//DEBUG
		return punktyNalezaceDoLinii;
	}
	
	private int podajSredniaWartoscWspolrzednejY(List<Integer> wspolrzedne){
		
		int suma = 0;
		for (Integer wartosc : wspolrzedne) {
			suma+= wartosc;
		}
		return Math.round(suma/wspolrzedne.size());
	}

	public Linia utworzLinieZPunktow(List<Point> punktyLinii) {

		Point start = punktyLinii.get(0);
		Point koniec = punktyLinii.get(punktyLinii.size() - 1);
		// utworz linie z punktow
		Linia linia = new Linia(start.x, start.y, koniec.x, koniec.y);
		return linia;
	}
	
	/**
	 * Sprzawdza, czy zestaw punktow, ktory otrzymalismy przechodzac po obrazie
	 * moze byc prosta, ktorej blad jest mniejszy niz maksymalny
	 * 
	 * @param points
	 * @return
	 */
	public double policzBladAproksymacji(List<Point> points) {

		// obliczanie bledu aproksymacji liniowej
		int n = points.size();
		double s0 = n;
		double s1 = 0.0;
		double s2 = 0.0;
		double t0 = 0.0;
		double t1 = 0.0;
		double t2 = 0.0;
		double a0; // wspolczynnik prostej: a w rownaniu y = ax + b
		double a1; // wspolczynnik prostej: b w rownaniu y = ax + b
		double delta;
		double error;
		double x, y;

		for (int i = 0; i < n; i++) {
			x = points.get(i).x;
			y = points.get(i).y;
			s1 += x;
			s2 += Math.pow(x, 2);
			t0 += y;
			t1 += (x * y);
			t2 += Math.pow(points.get(i).y, 2);
		}

		delta = s0 * s2 - (s1 * s1);
		if(delta == 0.0)
			//return true;
			return 0.0000000001;
		a0 = ((t0 * s2) - (t1 * s1)) / (delta);
		a1 = ((t1 * s0) - (t0 * s1)) / (delta);
		error = Math.sqrt(((n * t2 - Math.pow(t0, 2)) - (Math.pow(a1, 2) * delta)) / (n * (n - 1)));
		
		return error;
	}
	
//	public void narysujLinie(){														//DEBUG
//		
//		StringBuilder str = new StringBuilder("Narysowana linia:\r\n");
//		
//		for (Point punkt : kopiaPunktowLinii) {
//			kopiaObrazka.set(punkt.x, punkt.y, 999);
//		}
//		
//		for(int x = kopiaObrazka.getObszarCyfry().getGora(); x <= kopiaObrazka.getObszarCyfry().getDol(); x++){
//			for(int y=0; y<Obrazek.ROZMIAR; y++){
//				if(kopiaObrazka.getObrazek()[x][y] < 10)
//					str.append(kopiaObrazka.getObrazek()[x][y]).append("    ");
//				else if(kopiaObrazka.getObrazek()[x][y] < 100)
//					str.append(kopiaObrazka.getObrazek()[x][y]).append("   ");
//				else if(kopiaObrazka.getObrazek()[x][y]==999)
//					str.append(" * ").append("  ");
//				else 
//					str.append(kopiaObrazka.getObrazek()[x][y]).append("  ");
//				
//			}
//			str.append("\r\n");
//		}
//		
//		System.out.println(str.toString());
//	}
	
}
